iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
自我挑戰組

ABAP 基礎30天學習筆記系列 第 16

Day16_基礎ABAP SQL SELECT

  • 分享至 

  • xImage
  •  

原文連結:Implementing Basic SELECT Statements

SQL (Structured Query Language)

https://ithelp.ithome.com.tw/upload/images/20240912/20113802413HnRUxzS.png
所有的關聯式資料庫都可以使用SQL存取資料,而SQL是由三種主元件組成的:

  • Data Manipulation Language (DML)
    用來處理表格內的資訊,包含最常用的增刪改查(NSERT / SELECT / UPDATE / DELETE),這些語法可以直接對應到ABAP SQL。

  • Data Definition Language (DDL)
    提供創建表格以及其他表格物件的指令,如架構、索引跟視圖等,這些會透過ADT的特定編輯器執行,而非ABAP programs。

  • Data Control Language (DCL)
    可以限制特定使用者對資料的存取,但在ABAP中並非以經典寫法呈現,為了滿足不同母集團與子公司間的一對多關係,因其在使用者結構上並不是一對一的。

基礎ABAP SQL架構

在過往為了兼容不同資料庫,會將ABAP SQL按照各種資料庫的SQL語法轉譯成Native SQL。即使新版ABAP只支援HANA,仍然保有這些資料庫介面,主要基於以下理由:

  • 架構相容性:ABAP SQL 跟資料庫介面是系統架構的必要部分
  • 程式碼相容性:讓舊版ABAP SQL程式碼也能在新平台運作
  • 其他資料庫任務:除了語法轉換,也支援如自動化客戶管理的其他任務

搜尋一筆資料

DATA airport_from_id TYPE /DMO/airport_from_id.

 SELECT SINGLE
      FROM /dmo/connection
      FIELDS airport_from_id
      WHERE carrier_id    = 'LH' AND connection_id = '0400'
      INTO @airport_from_id.
  • SELECT:查詢語法以SELECT為開頭,SELECT後方接的SINGLE代表在這個查詢僅讀取一筆資料。
  • FROM:指定欲查詢的表格。
  • FIELDS:指定欲尋找的欄位,可一次指定多欄(以逗號分隔),也可以用FIELDS *搜整張表。
    WHERE 指定要篩選的條件,例如 WHERE carrier_id = 'LH' 會搜尋該欄值為'LH'的資料,可用AND OR NOT等條件運算子組合條件。雖然不一定要加上WHERE,但由於不加將會回傳整張表的資料,可能會造成效能問題。
  • INTO:在此指定用來存入查詢值的ABAP物件,通常會是structure或者internal table,並且理想上其欄位排序會跟搜尋的表一樣。後續章節會再對前兩個物件有更詳細的描述,本章都先將回傳結果存至單值變數中。

範例一,選取單個欄的值

DATA airport_from_id TYPE /DMO/airport_from_id.

SELECT SINGLE
    FROM  /dmo/connection
  FIELDS  airport_from_id
   WHERE  carrier_id    = 'LH'
     AND  connection_id = '0400'
    INTO  @airport_from_id.

目標值FRA將被存入ABAP物件airport_from_id中,注意變數與常數都須在前面加上@作為識別,避免出現變數與表格同名的歧意問題。

範例二,選取多個欄的值

DATA airport_from_id TYPE /DMO/airport_from_id.

SELECT SINGLE
    FROM  /dmo/connection
  FIELDS  airport_from_id,@airport_to_id
   WHERE  carrier_id    = 'LH'
     AND  connection_id = '0400'
    INTO  (@airport_from_id,@airport_to_id).

當搜尋的是同一筆資料列中的多個欄位,除了用逗號隔開欄位,還需要依回傳的欄位量,設定相應變數來存入搜尋結果。上面的範例便是取搜尋結果的其中兩欄回傳,並分別存入變數@airport_from_id@airport_to_id之中。

範例三,搜尋不到目標

DATA airport_from_id TYPE /DMO/airport_from_id.

SELECT SINGLE
    FROM  /dmo/connection
  FIELDS  airport_from_id
   "表格不存在以下條件的資料"
   WHERE  carrier_id    = 'XX'
     AND  connection_id = '1234'
    INTO  @airport_from_id.

假設搜尋條件如上例,為一個沒有相符結果的搜尋,ABAP SQL可以使用SY-SUBRC此一系統整數值來辨別是否成功搜到結果,當SY-SUBRC回傳0代表成功搜尋到查詢結果,然而在SELECTSY-SUBRC回傳4則代表找不到相關資料,回傳空結果。當回傳空結果時,這時將不會觸發存取INTO後的變數,其值將維持不變。

可以運用這個特性,設置找不到內容時的IF條件運算子,寫法如下:

SELECT ... 

"sy-subrc回傳0代表有搜尋到資料,回傳4則代表沒搜到資料"
IF sy-subrc = 0.
  ...
ELSE.
  ...
ENDIF.

SY-SUBRC盡量接在SELECT段落一結束的地方,避免SY-SUBRC的值又被變更

下一章開始要進入ABAP特有的CDS view囉!


上一篇
Day15_ABAP Table概述
下一篇
Day17_CDS view
系列文
ABAP 基礎30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言